package cn.song.freight.domain.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.List;

/**
 * 策略区域详情视图对象 (VO)
 * <pre>
 * 用于支持新界面设计的视图对象，按区域分组显示：
 * 1. 区域基本信息
 * 2. 该区域的首重、首费、续重、续费、抛重比参数
 * 3. 该区域适用的多个重量区间规则列表
 *
 * 对应界面设计：
 * - 左侧：运送区域列表
 * - 中间：计算规则（首重、首费、续重、续费、抛重比）
 * - 右侧：重量区间规则列表（多行，每行包含重量(kg)和资费(元)）
 *
 * @author SongRenShuo
 * @version 3.0.0
 * @since 2025-08-25
 * </pre>
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "策略区域详情视图对象")
public class StrategyAreaDetailVO {

    /**
     * 策略ID
     */
    @ApiModelProperty(value = "策略ID")
    private Long strategyId;

    /**
     * 策略名称
     */
    @ApiModelProperty(value = "策略名称")
    private String strategyName;

    /**
     * 区域ID
     */
    @ApiModelProperty(value = "区域ID")
    private Long areaId;

    /**
     * 区域完整名称
     */
    @ApiModelProperty(value = "区域完整名称")
    private String areaName;

    /**
     * 省份名称
     */
    @ApiModelProperty(value = "省份名称")
    private String provinceName;

    /**
     * 城市名称
     */
    @ApiModelProperty(value = "城市名称")
    private String cityName;

    /**
     * 区县名称
     */
    @ApiModelProperty(value = "区县名称")
    private String districtName;

    // ================================
    // 计算规则参数
    // ================================

    /**
     * 首重重量（kg）
     */
    @ApiModelProperty(value = "首重重量（kg）")
    private BigDecimal firstWeightKg;

    /**
     * 首重资费（元）
     */
    @ApiModelProperty(value = "首重资费（元）")
    private BigDecimal firstWeightFee;

    /**
     * 续重重量（kg）
     */
    @ApiModelProperty(value = "续重重量（kg）")
    private BigDecimal additionalWeightKg;

    /**
     * 续重资费（元）
     */
    @ApiModelProperty(value = "续重资费（元）")
    private BigDecimal additionalWeightFee;

    /**
     * 抛重比（如6000表示1m³按6000kg计费），0表示不启用体积重
     */
    @ApiModelProperty(value = "抛重比（如6000表示1m³按6000kg计费），0表示不启用体积重")
    private BigDecimal volumetricWeightRatio;

    // ================================
    // 重量区间规则列表
    // ================================

    /**
     * 该区域适用的重量区间规则列表
     */
    @ApiModelProperty(value = "重量区间规则列表")
    private List<WeightSegmentRuleVO> weightSegmentRules;

    // ================================
    // 业务方法
    // ================================


    /**
     * 获取计算规则描述
     * @return 计算规则描述
     */
    public String getCalculationRuleDescription() {
        return String.format("首重%skg/%s元，续重%skg/%s元，抛重比%s",
                firstWeightKg, firstWeightFee,
                additionalWeightKg, additionalWeightFee, volumetricWeightRatio);
    }

    /**
     * 获取重量区间规则数量
     * @return 重量区间规则数量
     */
    public int getWeightSegmentRuleCount() {
        return weightSegmentRules != null ? weightSegmentRules.size() : 0;
    }

    /**
     * 检查是否有重量区间规则
     * @return true-有规则，false-无规则
     */
    public boolean hasWeightSegmentRules() {
        return weightSegmentRules != null && !weightSegmentRules.isEmpty();
    }
}
